#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdbool.h>

//20. 有效的括号

bool isValid(char* s)
{
	Stack stack;
	StackInit(&stack);
	while (*s)
	{
		// 如果是左括号，就入栈
		if (*s == '(' || *s == '{' || *s == '[')
		{
			StackPush(&stack, *s);
			s++;
		}
		else // 如果是右括号，就出栈匹配
		{
			// 遇到右括号时，但是栈为空，说明没有左括号与其匹配
			if (StackEmpty(&stack))
			{
				StackDestroy(&stack);
				return false;
			}
			STDataType temp = StackTop(&stack);
			StackPop(&stack);
			if ((*s == ')' && temp != '(') || (*s == ']' && temp != '[') || (*s == '}' && temp != '{'))
			{
				StackDestroy(&stack);
				return false;
			}
			else
			{
				s++;
			}
		}
	}
	// 如果栈中不是空，说明栈中还有左括号，有左括号没有匹配（全是左括号）
	bool ret = StackEmpty(&stack);
	StackDestroy(&stack);
	return ret;
}